import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.sound.sampled.*;

// 自定义面板类，用于绘制背景图片
class BackgroundPanel extends JPanel {
    private BufferedImage backgroundImage;

    public BackgroundPanel() {
        try {
            backgroundImage = ImageIO.read(new File("328.jpg")); // 加载背景图片
        } catch (IOException e) {
            e.printStackTrace();
            setBackground(Color.LIGHT_GRAY); // 图片加载失败时使用默认灰色背景
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (backgroundImage != null) {
            g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this); // 绘制背景图片并拉伸
        }
    }
}

public class Calculator extends JFrame implements ActionListener {
    private JPanel north, center;           // 界面容器面板
    private JTextField field;               // 显示计算过程和结果的文本框
    private JButton[] btns;                 // 计算器按钮数组
    
    private Clip backgroundMusic;           // 背景音乐播放器
    private boolean isMusicPlaying = false; // 音乐播放状态标志
    private final String MUSIC_PATH = "唐米拖拉机伴奏.wav"; // 背景音乐文件路径

    public Calculator() {
        setTitle("计算器");
        setSize(700, 700);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        
        initMusic();                        // 初始化音频播放器
        
        BackgroundPanel contentPane = new BackgroundPanel();
        setContentPane(contentPane);        // 设置自定义背景面板
        contentPane.setLayout(new BorderLayout());//组件布局
        
        initComponent();                    // 初始化界面组件
        setVisible(true);
    }

    // 初始化音频播放器，设置循环播放
    private void initMusic() {
        try {
            AudioInputStream audioIn = AudioSystem.getAudioInputStream(new File(MUSIC_PATH));
            backgroundMusic = AudioSystem.getClip();
            backgroundMusic.open(audioIn);//准备资源，为音乐配置环境
            backgroundMusic.loop(Clip.LOOP_CONTINUOUSLY); // 设置为循环播放
            backgroundMusic.stop();                        // 初始状态为停止
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(this, "音频加载失败：" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    // 初始化计算器界面组件
    private void initComponent() {
        north = new JPanel(new BorderLayout());
        center = new JPanel();
        field = new JTextField();
        
        north.setOpaque(false);  // 设置面板透明
        center.setOpaque(false); // 设置面板透明
        
        field.setPreferredSize(new Dimension(700, 150)); // 设置文本框大小
        field.setEditable(false);                        // 禁止键盘输入
        field.setFont(new Font("SansSerif", Font.BOLD, 40)); // 设置字体
        field.setOpaque(false);                          // 设置文本框透明
        field.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); // 设置黑色边框
        
        // 定义计算器按钮文本
        String[] str = new String[]{
            "7", "8", "9", "+", "(",
            "4", "5", "6", "-", ")",
            "1", "2", "3", "×", "√",
            "0", ".", "=", "÷", "Π",  
            "C", "B", "T", "S", ""
        };

        // 初始化按钮数组并设置样式
        btns = new JButton[str.length];
        for (int i = 0; i < btns.length; i++) {
            btns[i] = new JButton(str[i]);
            btns[i].setFont(new Font("SansSerif", Font.BOLD, 25)); // 设置按钮字体
            btns[i].setOpaque(false);             // 设置按钮透明
            btns[i].setContentAreaFilled(false);  // 不填充按钮内容区域
            btns[i].setBorderPainted(true);       // 显示按钮边框
            btns[i].setForeground(Color.RED);     // 设置按钮文字为红色
            btns[i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); // 设置黑色边框
        }

        center.setLayout(new GridLayout(5, 5, 5, 5)); // 设置5x5网格布局
        north.add(field, BorderLayout.CENTER);        // 将文本框添加到北部面板
        for (JButton btn : btns) {
            center.add(btn);                          // 将按钮添加到中部面板
        }
        
        // 添加面板边距
        north.setBorder(BorderFactory.createEmptyBorder(20, 20, 10, 20));
        center.setBorder(BorderFactory.createEmptyBorder(10, 20, 20, 20));
        
        // 将面板添加到窗口
        add(north, BorderLayout.NORTH);
        add(center, BorderLayout.CENTER);

        // 为所有按钮添加事件监听器
        for (JButton btn : btns) {
            btn.addActionListener(this);
        }
    }

    // 计算平方根功能
    private void calculateSquareRoot() {
        try {
            String currentText = field.getText();
            double number = Double.parseDouble(currentText);
            if (number < 0) {
                field.setText("错误：负数不能开平方"); // 处理负数情况
                return;
            }
            double result = Math.sqrt(number);
            field.setText(result + ""); // 显示计算结果
        } catch (NumberFormatException e) {
            field.setText("错误：输入格式不正确"); // 处理格式错误
        }
    }

    // 处理按钮点击事件
    private void setBtnText(String text) {
        switch (text) {
            case "C":
                field.setText(""); // 清空文本框
                break;
            case "B":
                String numText = field.getText();
                if (numText.length() > 0) {
                    field.setText(numText.substring(0, numText.length() - 1)); // 删除最后一个字符
                }
                break;
            case "T":
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                field.setText(sdf.format(new Date())); // 显示当前时间
                break;
            case "S":
                toggleMusic(); // 切换背景音乐播放状态
                break;
            case "=":
                calculate(); // 执行计算
                break;
            case "√":
                calculateSquareRoot(); // 计算平方根
                break;
            case ".":
                String currentText = field.getText();
                if (currentText.isEmpty()) {//判断输入框是否为null
                    field.setText("0."); // 空文本时自动补0
                } else {
                    String lastNumber = getLastNumber(currentText);
                    if (lastNumber.contains(".")) {
                        return; // 已有小数点，禁止重复输入
                    }
                    field.setText(currentText + "."); // 添加小数点
                }
                break;
            default:
                field.setText(field.getText() + text); // 添加按钮文本到输入框
                break;
        }
    }

    // 切换背景音乐播放状态
    private void toggleMusic() {
        if (backgroundMusic != null) {
            if (isMusicPlaying) {
                backgroundMusic.stop(); // 停止播放
                field.setText("背景音乐已关闭");
                // 3秒后恢复显示计算内容
                Timer timer = new Timer(3000, e -> {
                    if (!field.getText().matches(".*[0-9+\\-*/().=√Π].*")) {
                        field.setText("");
                    }
                });
                timer.setRepeats(false);
                timer.start();
            } else {
                backgroundMusic.start(); // 开始播放
                field.setText("背景音乐已开启");
                // 3秒后恢复显示计算内容
                Timer timer = new Timer(3000, e -> {
                    if (!field.getText().matches(".*[0-9+\\-*/().=√Π].*")) {
                        field.setText("");
                    }
                });
                timer.setRepeats(false);
                timer.start();
            }
            isMusicPlaying = !isMusicPlaying; // 切换播放状态标志
        }
    }

    // 获取当前表达式中的最后一个数字部分
    private String getLastNumber(String expression) {
        String operators = "+-×÷()";
        int lastOperatorIndex = -1;
        // 从后往前查找最后一个运算符位置
        for (int i = expression.length() - 1; i >= 0; i--) {
            if (operators.contains(expression.substring(i, i + 1))) {
                lastOperatorIndex = i;
                break;
            }
        }
        // 返回最后一个运算符后的子字符串（即最后一个数字）
        return (lastOperatorIndex == -1) ? expression : expression.substring(lastOperatorIndex + 1,expression.length());
    }

    // 执行表达式计算
    private void calculate() {
        String expression = field.getText();
        // 替换运算符为JavaScript可识别的格式
        expression = expression.replace("×", "*").replace("÷", "/").replace("Π", "3.1415926");
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        try {
            Object result = engine.eval(expression);
            field.setText(result + ""); // 显示计算结果
        } catch (ScriptException e) {
            field.setText("计算错误"); // 处理计算异常
        }
    }

    // 处理按钮点击事件
    public void actionPerformed(ActionEvent a) {
        if (a.getSource() instanceof JButton) {
            JButton btn = (JButton) a.getSource();
            setBtnText(btn.getText()); // 调用按钮处理方法
        }
    }

    // 程序退出时释放音频资源
    @Override
    public void dispose() {
        if (backgroundMusic != null && backgroundMusic.isOpen()) {
            backgroundMusic.close(); // 关闭音频资源
        }
        super.dispose();
    }

    // 程序入口点
    public static void main(String[] args) {
        SwingUtilities.invokeLater(Calculator::new); // 在事件调度线程中创建GUI
    }
}